]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
allView, frequentView: Only create icons when necessary
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Thu, 21 Nov 2019 20:57:17 +0000 (17:57 -0300)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Thu, 21 Nov 2019 22:28:46 +0000 (22:28 +0000)
The views (AllView and FrequentView) build a list of all applications
they contain. BaseView then diffs between what's currently added, and
what needs to be added, and removed.

This approach has a problem though: creating an AppIcon or a FolderIcon
connects to various signals, and we confuse the garbage collector.

When building the list of applications, instead of always creating new
icons, try to use already existing icons first.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1610
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1694

js/ui/appDisplay.js

index 9a7b6452148940cd05e2c77f9bdf36f3850e6cf8..838fef6077b520ab8c5d389785d1c330f7aad963 100644 (file)
@@ -491,10 +491,15 @@ var AllView = GObject.registerClass({
         let favoritesWritable = global.settings.is_writable('favorite-apps');
 
         apps.forEach(appId => {
-            let app = appSys.lookup_app(appId);
+            let icon = this._items[appId];
+            if (!icon) {
+                let app = appSys.lookup_app(appId);
+
+                icon = new AppIcon(app, {
+                    isDraggable: favoritesWritable,
+                });
+            }
 
-            let icon = new AppIcon(app,
-                                   { isDraggable: favoritesWritable });
             newApps.push(icon);
         });
 
@@ -947,8 +952,12 @@ class FrequentView extends BaseAppView {
         for (let i = 0; i < mostUsed.length; i++) {
             if (!mostUsed[i].get_app_info().should_show())
                 continue;
-            let appIcon = new AppIcon(mostUsed[i],
-                                      { isDraggable: favoritesWritable });
+            let appIcon = this._items[mostUsed[i].get_id()];
+            if (!appIcon) {
+                appIcon = new AppIcon(mostUsed[i], {
+                    isDraggable: favoritesWritable,
+                });
+            }
             apps.push(appIcon);
         }